
// force IE img cache (исправление мигающих роловер-картинок в IE)
try {document.execCommand("BackgroundImageCache", false, true);} catch(e) {}

function $(id) {
    return 	typeof(id)=='object' ? id 
			:(document.getElementById(id) ? document.getElementById(id)
			: document.getElementsByName(id))
}


function addOnLoad(func) 
{  
	var oldonload = window.onload;  
	
	if (typeof window.onload != 'function') 
		window.onload = func;  
	else {    
		window.onload = function() 
		{      
			if (oldonload) {oldonload();} func();   
		}
	}	
}

function domReady( f ) 
{
    //alert(f)
	 // If the DOM is already loaded, execute the function right away
    if ( domReady.done ) return f();

    // If we’ve already added a function
    if ( domReady.timer ) {
        // Add it to the list of functions to execute
        domReady.ready.push(f);
    } else {
	
        // Attach an event for when the page finishes  loading,
        // just in case it finishes first. Uses addEvent.
        //
		addEvent( window, "load", isDOMReady );

        // Initialize the array of functions to execute
        domReady.ready = [ f ];
		

        //  Check to see if the DOM is ready as quickly as possible
        domReady.timer = setInterval( isDOMReady, 13 );
    } 
}
onDomReady = domReady

// Checks to see if the DOM is ready for navigation
function isDOMReady() {
    // If we already figured out that the page is ready, ignore
    if ( domReady.done ) return false;

    // Check to see if a number of functions and elements are
    // able to be accessed
    if ( document && document.getElementsByTagName && 
          document.getElementById && document.body ) {
		
		// Remember that we’re now done 
		domReady.done = true;
		 
        // If they’re ready, we can stop checking
        clearInterval( domReady.timer );
        domReady.timer = null;

        // Execute all the functions that were waiting
        for ( var i = 0; i < domReady.ready.length; i++ )
            domReady.ready[i]();

        domReady.ready = null;
       
    }
}
function addEvent(obj,name,func){
	if(obj.addEventListener) 
		obj.addEventListener(name, func, false);              
	else if (obj.attachEvent) 
		obj.attachEvent('on'+name, func);           
	else 
		throw 'Error'        
}
 /* */

 
 /* 
setStyles(obj, styles) - устанавливает для элемента obj (obj - это id, name или ссылка на объект) стили styles (объект вида {prop: value, prop:value} ), возвращает старые значения указанных стилей
*/
function setStyles(obj, styles)
{
	var obj=$(obj) , oldstyle = {}
	if (obj && styles && typeof(styles)=='object' )
		for (name in styles)
			{
				oldstyle[name] = obj.style[name]
				obj.style[name] = styles[name] 
			}	
	return 	oldstyle;
}
 

function Cookie(){}
Cookie.get = function(name)
	{
		var cookie = " " + document.cookie;
		var search = " " + name + "=";
		var setStr = null;
		var offset = 0;
		var end = 0;
		if (cookie.length > 0) {
			offset = cookie.indexOf(search);
			if (offset != -1) {
				offset += search.length;
				end = cookie.indexOf(";", offset)
				if (end == -1) {
					end = cookie.length;
				}
				setStr = unescape(cookie.substring(offset, end));
			}
		}
		return(setStr);
	}

Cookie.set = function(name, value, expire_days, path)
{
	// если path не указан, то path="/" - кука устанавливает на весь сайт
	// если path указан и равен "", то на текущую страницу
	if(!path && path!=="") path="/"
	
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expire_days);
	document.cookie=
		name + "=" +escape(value) +
		((expire_days==null) ? "" : ";expires="+exdate.toGMTString()) +
		((path) ? "; path=" + escape(path) : "") 
		;
}

Cookie.del = function(name, path) 
{
	var e = new Date();
	e.setTime(e.getTime() - 1000);
	this.set(name, '', e, path);
}
Cookie.remove = Cookie.del


function showHide(id, isInline)  
{
	var obj=$(id)
	if (!obj || !obj.style) return false; 
	
	obj = obj.style;
	if (obj.display == 'none') 
		{
		obj.display = isInline? 'inline' : 'block';
		return true;
		}
	else 
		{
		obj.display = 'none';
		return false;
		}
}

function show(id, isInline)
{
    $(id).style.display = isInline? 'inline' : 'block';
}
function hide(id)
{
    $(id).style.display = 'none';
}



function getFrameWin(frameID) {
	var f=document.getElementById(frameID)
	if (!f) f=document.getElementsByName(frameID)
	
	if (f.contentWindow) return f.contentWindow
	else return false;
}


function getWindowSize(win) // Определение текущей ширины и высоты активного окна браузера 
{
	var res={w:'', h:''}
	if (!win) win = self;
	
	// общий синтаксис	
	if (win.innerHeight) 
		{res.w = win.innerWidth; res.h = win.innerHeight;}
			
	// IE 6 Strict Mode	 
	else if (win.document.documentElement && win.document.documentElement.clientHeight)
	{
		res.w = win.document.documentElement.clientWidth;
		res.h = win.document.documentElement.clientHeight;
	}	

	// Остальные версии IE	} 
	else if (win.document.body) {	    
		res.w = win.document.body.clientWidth;	    
		res.h = win.document.body.clientHeight;	
	}	
	return res	
}


function getWindowScroll(win) // Определение текущего скролинга окна браузера
{
	var res={x:'', y:''}
	if (!win) win = self;
	
	// Opera, Mozilla	
	if (win.pageXOffset) 
		{res.x = win.pageXOffset; res.y = win.pageYOffset;}
			
	// IE 6 Strict Mode	 
	else if (win.document.documentElement)
	{
		res.x = win.document.documentElement.scrollLeft;
		res.y = win.document.documentElement.scrollTop;
	}	

	// Остальные версии IE	 
	if (!res.y && !res.x && win.document.body) {	    
		res.x = win.document.body.scrollLeft;	    
		res.y = win.document.body.scrollTop;	
	}	
	return res	
}
function getWindowScrollY(win){
  var s=getWindowScroll(win);
  return s.y;
}


function getFrameDoc(frameID, doc) {
	if (!doc) doc=document
	var f=doc.getElementById(frameID)
	if (!f) f=doc.getElementsByName(frameID)
	
	if (f)
	{
		if    (f.contentDocument) return f.contentDocument
		else if (f.contentWindow) return f.contentWindow.document
	}
}


/*	
	autoIframe(iframe)
	подстраивает размер указанного Iframe под размеры его контента 
	@param iframe - это объект или id изменяемого фрейма
	пример использования: 
	<iframe onload="autoIframe(this)" ></iframe>
*/
function autoIframe(iframe)
{
	var innerDoc, contentHeight, objToResize;
	
	// приводим ID к объектному типу
	iframe = $(iframe);
	
	// вычисляем ссылку на объект document фрейма
	innerDoc = (iframe.contentDocument) ? iframe.contentDocument : iframe.contentWindow.document;
	
	// определяем корректной объект для ресайза  
	objToResize = (iframe.style) ? iframe.style : iframe;
	
	// сброс высоты - сначала уменьшаем высоту фрейма, чтобы не испльзовать большую высоту , елси контент меньше текущей высоты фрейма
	objToResize.height = 30;
	
	// вычисляем высоту содержимого фрейма
	if (innerDoc.body && innerDoc.body.scrollHeight)
		{contentHeight = innerDoc.body.scrollHeight + 0; }
	else
	if (innerDoc.body && innerDoc.body.offsetHeight)
		{contentHeight = innerDoc.body.offsetHeight + 32; }
	else 
	if (iframe.Document && iframe.Document.body.scrollHeight) //ie5+ syntax
		contentHeight = iframe.Document.body.scrollHeight;
	//else  contentHeight = 300;
	
	
	
	// изменяем высоту фрейма
	objToResize.height = contentHeight;
	 
}


//Размер документа по вертикали
function getDocumentHeight(win)
{
	if (!win) win=self
	return (win.document.body.scrollHeight > win.document.body.offsetHeight)? win.document.body.scrollHeight : win.document.body.offsetHeight;
}

//Размер документа по горизонтали
function getDocumentWidth()
{
	if (!win) win=self
	return (win.document.body.scrollWidth > win.document.body.offsetWidth)?win.document.body.scrollWidth : win.document.body.offsetWidth;
}

function getRadioGroupValue(radioGroupObj)
{
  for (var i=0; i < radioGroupObj.length; i++)
    if (radioGroupObj[i].checked) return radioGroupObj[i].value;

  return null;
}
function trim(s)
{
  return rtrim(ltrim(s));
}

function ltrim(s)
{
  return s.replace(/^\s+/, ''); 
}

function rtrim(s)
{
  return s.replace(/\s+$/, ''); 
}
 
 function randomNumber (m,n)
{
  m = parseInt(m);
  n = parseInt(n);
  return Math.floor( Math.random() * (n - m + 1) ) + m;
}


function getElementsByClassName(classname, node) 
{
	if (!node) node = document.getElementsByTagName("body")[0];
	var a = [];
	var re = new RegExp('\\b' + classname + '\\b');
	var els = node.getElementsByTagName("*");
	//alert(els.length)
	for (var i=0,j=els.length; i<j; i++)
		if (re.test(els[i].className))
			a.push(els[i]);
	//	alert(classname)
	return a; 
}

function getElementsByTagName(tagName, node) 
{
	if (!node) node=document
	return node.getElementsByTagName(tagName)
}






function getElementCurrentStyle(elem, prop)
{
  if (typeof elem!="object") elem = document.getElementById(elem);
  
  // external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
  if (document.defaultView && document.defaultView.getComputedStyle)
  {
    if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
    return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
  }
  
  // external stylesheet for Explorer and Opera 9
  if (elem.currentStyle)
  {
    var i;
    while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
    return elem.currentStyle[prop];
  }
  
  return "";
}

function textareaCurLineNum(obj)
{
  var rowHeight = obj.clientHeight/obj.rows;
  var curHeight = obj.createTextRange().boundingHeight;

  return parseInt(curHeight/rowHeight)+(obj.value!=''?1:0);
}

function getTextareaCaretPos(obj)
{
  obj.focus();
  
  if(obj.selectionStart) return obj.selectionStart;//Gecko
  else if (document.selection)//IE
  {
    var sel = document.selection.createRange();
    var clone = sel.duplicate();
    sel.collapse(true);
    clone.moveToElementText(obj);
    clone.setEndPoint('EndToEnd', sel);
    return clone.text.length;
  }
  
  return 0;
}

function replaceSelectedText(obj,cbFunc)
{
 obj.focus();
 
 if (document.selection) 
 {
   var s = document.selection.createRange(); 
   if (s.text)
   {
     eval("s.text="+cbFunc+"(s.text);");
	 s.select();
	 return true;
   }
 }
 else if (typeof(obj.selectionStart)=="number")
 {
   if (obj.selectionStart!=obj.selectionEnd)
   {
     var start = obj.selectionStart;
     var end = obj.selectionEnd;

     eval("var rs = "+cbFunc+"(obj.value.substr(start,end-start));");
     obj.value = obj.value.substr(0,start)+rs+obj.value.substr(end);
     obj.setSelectionRange(end,end);
   }
   return true;
 }

 return false;
}
/*Пример использования:
//Определяем вспомогательную ф-ю которая
//принимает строку и возвращает её в нижнем регистре
function lCase(s){return s.toLowerCase();}

//заменяем выделенную строку в нижний регистр
replaceSelectedText(document.formName.textareaName,'lCase');

*/


// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
	var vars = [], hash;
	var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
	for(var i = 0; i < hashes.length; i++)
	{
		hash = hashes[i].split('=');
		vars.push(hash[0]);
		vars[hash[0]] = hash[1];
	}
	return vars;
}


//  аналог PHP функции urlencode
// реализует UTF-8 кодирование строки
function urlencode (str) 
{
    // http://phpjs.org
	// http://kevin.vanzonneveld.net
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'

    str = (str+'').toString();
    
    // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
    // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}

function urldecode (str) 
{
	// http://phpjs.org
    // http://kevin.vanzonneveld.net
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    
    return decodeURIComponent(str.replace(/\+/g, '%20'));
}	


function parse_url (str, component) {
    // http://phpjs.org
	// http://kevin.vanzonneveld.net
    // *     example 1: parse_url('http://username:password@hostname/path?arg=value#anchor');
    // *     returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}

    var  o   = {
        strictMode: false,
        key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
        q:   {
            name:   "queryKey",
            parser: /(?:^|&)([^&=]*)=?([^&]*)/g
        },
        parser: {
            strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
            loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-protocol to catch file:/// (should restrict this)
        }
    };
    
    var m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
    uri = {},
    i   = 14;
    while (i--) {uri[o.key[i]] = m[i] || "";}
    // Uncomment the following to use the original more detailed (non-PHP) script
    /*
        uri[o.q.name] = {};
        uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
        if ($1) uri[o.q.name][$1] = $2;
        });
        return uri;
    */

    switch (component) {
        case 'PHP_URL_SCHEME':
            return uri.protocol;
        case 'PHP_URL_HOST':
            return uri.host;
        case 'PHP_URL_PORT':
            return uri.port;
        case 'PHP_URL_USER':
            return uri.user;
        case 'PHP_URL_PASS':
            return uri.password;
        case 'PHP_URL_PATH':
            return uri.path;
        case 'PHP_URL_QUERY':
            return uri.query;
        case 'PHP_URL_FRAGMENT':
            return uri.anchor;
        default:
            var retArr = {};
            if (uri.protocol !== '') {retArr.scheme=uri.protocol;}
            if (uri.host !== '') {retArr.host=uri.host;}
            if (uri.port !== '') {retArr.port=uri.port;}
            if (uri.user !== '') {retArr.user=uri.user;}
            if (uri.password !== '') {retArr.pass=uri.password;}
            if (uri.path !== '') {retArr.path=uri.path;}
            if (uri.query !== '') {retArr.query=uri.query;}
            if (uri.anchor !== '') {retArr.fragment=uri.anchor;}
            return retArr;
    }
}

function http_build_query (formdata, numeric_prefix, arg_separator) 
{
    // http://kevin.vanzonneveld.net
    // -    depends on: urlencode
    // *     example 1: http_build_query({foo: 'bar', php: 'hypertext processor', baz: 'boom', cow: 'milk'}, '', '&amp;');
    // *     returns 1: 'foo=bar&amp;php=hypertext+processor&amp;baz=boom&amp;cow=milk'
    // *     example 2: http_build_query({'php': 'hypertext processor', 0: 'foo', 1: 'bar', 2: 'baz', 3: 'boom', 'cow': 'milk'}, 'myvar_');
    // *     returns 2: 'php=hypertext+processor&myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk'

    var value, key, tmp = [];

    var _http_build_query_helper = function (key, val, arg_separator) {
        var k, tmp = [];
        if (val === true) {
            val = "1";
        } else if (val === false) {
            val = "0";
        }
        if (val !== null && typeof(val) === "object") {
            for (k in val) {
                if (val[k] !== null) {
                    tmp.push(_http_build_query_helper(key + "[" + k + "]", val[k], arg_separator));
                }
            }
            return tmp.join(arg_separator);
        } else if (typeof(val) !== "function") {
            return this.urlencode(key) + "=" + this.urlencode(val);
        } else {
            throw new Error('There was an error processing for http_build_query().');
        }
    };

    if (!arg_separator) {
        arg_separator = "&";
    }
    for (key in formdata) {
        value = formdata[key];
        if (numeric_prefix && !isNaN(key)) {
            key = String(numeric_prefix) + key;
        }
        tmp.push(_http_build_query_helper(key, value, arg_separator));
    }

    return tmp.join(arg_separator);
}
